/*
 * Copyright (c) 2005, Haxe China community .
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY HAXE CHINA COMMUNITY "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL HAXE CHINA COMMUNITY BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 * 
 * Copyright (c) 1998 著作权由Haxe中国社区所有。著作权人保留一切权利。
 * 
 * 这份授权条款，在使用者符合以下三条件的情形下，授予使用者使用及再散播本
 * 软件包装原始码及二进位可执行形式的权利，无论此包装是否经改作皆然：
 * 
 * 对于本软件源代码的再散播，必须保留上述的版权宣告、此三条件表列，以
 * 及下述的免责声明。
 * 对于本套件二进位可执行形式的再散播，必须连带以文件以及／或者其他附
 * 于散播包装中的媒介方式，重制上述之版权宣告、此三条件表列，以及下述
 * 的免责声明。
 * 
 * 免责声明：本软件是由Haxe中国社区及本软件之贡献者以现状（"as is"）提供，
 * 本软件包装不负任何明示或默示之担保责任，包括但不限于就适售性以及特定目
 * 的的适用性为默示性担保。Haxe中国社区及本软件之贡献者，无论任何条件、
 * 无论成因或任何责任主义、无论此责任为因合约关系、无过失责任主义或因非违
 * 约之侵权（包括过失或其他原因等）而起，对于任何因使用本软件包装所产生的
 * 任何直接性、间接性、偶发性、特殊性、惩罚性或任何结果的损害（包括但不限
 * 于替代商品或劳务之购用、使用损失、资料损失、利益损失、业务中断等等），
 * 不负任何责任，即在该种使用已获事前告知可能会造成此类损害的情形下亦然。
 * 
 * 本许可证之中文译本中若有任何歧义，以英文版本为准。
 */
package com.haxecn.network;

import flash.utils.ByteArray;
import flash.utils.Endian;

/**
	The SocketPackager class.<br />
	Author Icebird<br />
	Detail: <br />
	Events: none.
**/


class SocketPackager
{
	/**
		数据发送前封包函数<br />
		参数：<br />
		data 要封包的数据<br/>
		compress 压缩方法，0为不压缩。<br />
		encryp 加密方法,0为不加密。<br />
		<hr />
		返回值:	封包后的数据<hr />
		抛出错误：无
	**/
	public static function pack(data:ByteArray,?compress:UInt = 0,?encryp:UInt = 0):ByteArray
	{
		var result:ByteArray = new ByteArray();
		result.endian = Endian.LITTLE_ENDIAN;
		#if comver2
		
		#else
		
		//写入包标识
		result.writeShort(0x87E1);
		//写入版本号
		result.writeByte(1);
		//写入包长度
		result.writeUnsignedInt(data.length + 15);
		//写入压缩方法标识
		result.writeUnsignedInt(compress);
		//写入加密方法标识
		result.writeUnsignedInt(encryp);
		//加密数据
		//压缩数据
		//写入数据
		result.writeBytes(data);
		
		#end
		
		return result;
	}

	/**
		收到数据后解包函数<br />
		参数：<br />
		data 要解包的数据<br/>
		compress 压缩方法，0为不压缩。<br />
		encryp 加密方法,0为不加密。<br />
		<hr />
		返回值:	解包后的数据<hr />
		抛出错误：无
	**/
	public static function unpack(data:ByteArray, ?compress:UInt = 0, ?encryp:UInt = 0):ByteArray
	{
		
		var result:ByteArray = new ByteArray();
		result.endian = Endian.LITTLE_ENDIAN;
		#if comver2
		
		#else
		
		//验证包（暂时不做）
		//解包
		data.position = 15;
		data.readBytes(result);
		//解压数据
		//解密数据
		#end
		
		return result;
	}

	/**
		收到数据后判断是否有连包并分解数据包<br />
		参数：<br />
		data 要分解的数据流<hr />
		返回值:	分解包后的数据数组<hr />
		抛出错误：无
	**/
	public static function split(data:ByteArray, ?compress:UInt = 0, ?encryp:UInt = 0):Array<ByteArray>
	{
		var result:Array<ByteArray> = new Array();
		var packPos:UInt = 0;
		var dataLength:UInt = 0;
		var tempBytes:ByteArray;
		var tempDatas:ByteArray;
		data.endian = Endian.LITTLE_ENDIAN;
		data.position = 0;
		#if comver2
		
		#else
		while(true)
		{
			packPos = data.position;
			//读取数据的前两个字节,查看是否错包。
			if(data.readUnsignedShort() == 0x87E1)
			{
				
			}
			//读取数据的第三个字段，查看包长度。01
			data.position++;
			trace("读取数值指针位置"+ data.position);
			dataLength = data.readUnsignedInt();
			//分解出一个包
			data.position = packPos;
			trace("当前指针位置" + data.position);
			trace("包长度" + data.length);
			trace("读取长度"+ dataLength);
			tempBytes = new ByteArray();
			data.readBytes(tempBytes,0,dataLength);
			tempDatas = unpack(tempBytes,compress,encryp);
			result.push(tempDatas);
			//如已是最后一个包，则跳出循环
			trace("读取完毕后指针"+data.position);
			if(data.length == data.position)
			{
				break;
			}
		}
		#end
		
		return result;
	}
}
